<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>正则表达式基础学习</title>
</head>
<body>
  <script>
    // 正则表达式是用一种模式来匹配字符串
    // 正则表达式php，java， js... 都可以使用，在具体使用时可能会有相关的细微差异
    // js中字符串有match(正则表达式)方法可以进行模式匹配，匹配成功时返回数组，否则返回null
    // js正则表达式的模式： /.../

    // 1:匹配普通字符
    // 2:正则默认区分大小写
    // 3:正则的修饰符：i:不区分大小写； g:全局搜索；m:多行匹配（m修饰符的作用是修改^和$在正则表达式中的作用，让它们分别表示行首和行尾。)
    // ^和$在正则中是用来完全匹配的，是用来规定头和尾的，而m则使^和$作用于行头和行尾
    var str = 'hello java'
    var res = str.match(/A/ig)
    // console.log(res)

    var str = 'I \nlove you' // 多行通过\n来进行分隔
    var res = str.match(/^l/m)
    // console.log(res)

    // 范围匹配的字符 \d: 匹配0~9 \w：匹配字母，数字，下划线 .：匹配除换行外的所有字符(\n) 一次匹配一个字符
    var str = 'world\n2018~*'
    var res = str.match(/\d\w./g) // 匹配三个字符
    // console.log(res)

    // 自定义规则的匹配符 [234]匹配其中的某一个字符，[^234]取反匹配其中的字符 一次匹配一个字符
    // [jpg|png] 只会把里面的内容当成单个字符进行匹配：j,p,g,|,p,n，可以使用(jpg|png)进行整体匹配
    var str = '128'
    var res = str.match(/1[^389]\d/)
    // console.log(res)

    // 修饰匹配次数 {n},{n,m}包含n和m,{n,}
    // +：1~max  ?：0~1  *：0~max
    var str = '13' // 在该字符串中能够匹配到该正则模式
    var res = str.match(/1\d+3/)
    // console.log(res)

    // 完整匹配（模式匹配的不是字符串中的某个部分，而是全部匹配）^开始匹配，$结束匹配
    var str = '12345678'
    var res = str.match(/^\d{4}$/g)
    // console.log(res)

    // 如何匹配特殊符号，通过转义特殊字符\
    var str = '^23.'
    var res = str.match(/\^\d+\./)
    // console.log(res)

    //条件分支|和()
    // ()会将其中包含的内容作为一个整体与外面的字符分开，并且会将()的内容作为模式再和字符串进行匹配
    // (?:)代表对()中的内容不再进行匹配，只匹配外部的正则
    var str = 'abc.jpeg'
    var res = str.match(/(?:\.)(?:png|jpe?g)$/)
    // console.log(res)

    // 正则表达式中相当重要的一个技巧：分析正则表达式的写法
    // 匹配一个相对比较复杂的字符时，可以使用()将字符分成几个块进行编写，分别完成后再将编写好的()独立块进行拼接
    // 就达到了化繁为简的效果

    // 正则匹配的贪婪与懒惰，正则中默认是贪婪模式，在修饰数量的匹配符后面添加?，则代表懒惰
    // 贪婪：尽可能多的匹配字符； 懒惰：在保证能够匹配的前提下，尽量少的匹配字符
    var str = 'acac'
    var res = str.match(/a.*?c/g)
    // console.log(res)

    // 正则表达式补充的知识点
    // 正则表达式中的正向反向预查，左边或者有右边的模式只是一个匹配条件，并不会把正向反向的内容匹配进去
    // 正向预查是对pattern的右边有字符模式的限制
    // 正向肯定与预查：pattern(?=) 匹配pattern并且pattern右边必须满足(?=)中的条件，才能匹配成功
    // 正向否定预查：pattern(?!) 匹配pattern字符并且字符的右边不能含有(?!)中的模式
    var str = 'windowa23windowb45windowc58'
    var res = str.match(/window.(?!45)/g)
    // console.log(res)
    // 反向预查则是对pattern的左边字符有模式限制
    // 反向肯定预查 (?<=)pattern 对pattern的左边字符有模式限制
    // 反向否定预查 (?<!)pattern pattern左边的字符不能匹配(?=!)中的模式
    var str = '123hha 456hhb abdhhc'
    // var res = str.match(/(?<=\d{3})hh.?/g)
    // console.log(res)

    // (?:)和(?=),(?!),(?<=),(?<!)他们都不会将()中的内容拿出来进行单独的匹配，区别是(?:)的模式会在匹配结果中出现，而后面的则只是当作一个匹配的条件，并不会将能够匹配模式的部分放入结果中

    // [A-B]可以匹配自定义范围内的字符
    // [^A-B]匹配除A-B范围的字符
    var str = 'dfasdfASDF'
    var res = str.match(/[^A-Z]/g)
    // console.log(res)

    // 正则中的的匹配符
    // \b 匹配单词边界 \D匹配非单词边界 \n换行符 \r回车符 \t tab键
    var str = 'hello world\n'
    var res = str.match(/llo\D.*\n/)
    console.log(res)

    // 匹配非空格
    var regexp = /[^\s]+/
  </script>

</body>
</html>





